home *** CD-ROM | disk | FTP | other *** search
Wrap
Text File | 1987-04-21 | 51.6 KB | 1,239 lines
------------------------------------------------------------------------ **************************************************************** * MIDI8031 Mikrocontroller-Entwicklungssystem für ATARI ST/STE * **************************************************************** Autor: Jürgen Piscol, Rastatterstr. 144, W-7500 Karlsruhe 51 Tools: Alle Programme von mir (JP) wurden mit LASER C entwickelt (bis auf TESTRAM.PRG) WICHTIGER HINWEIS: ================== ALLE PROGRAMME DIESES ENTWICKLUNGSSYSTEMS SIND PUBLIC DOMAIN! SIE DÜRFEN ABER NUR UNTER DER VORAUSSETZUNG KOPIERT WERDEN, DASS KEIN TEIL DES ENTWICKLUNGSSYSTEMS VERÄNDERT WIRD! DIE VORLIEGENDE SOFTWARE WURDE MIT GRÖSSTER SORGFALT ERSTELLT. TROTZDEM LASSEN SICH FEHLER NICHT MIT SICHERHEIT AUSSCHLIESSEN. DAHER KANN ICH KEIN HAFTUNG FÜR IRGENDWELCHE SCHÄDEN ÜBERNEHMEN, DIE DURCH DEN GEBRAUCH DIESER SOFTWARE ODER HARDWARE ENTSTEHEN KÖNNTEN. ------------------------------------------------------------------------ Inhalt: ======= 1.) Vorwort, Übersicht 2.) Die Hardware MIDI8031 3.) Installation, Zusatzprogramme 4.) Shell (SHELL51.PRG) 5.) Assembler (A51.TTP) 6.) Disassembler (DIS51.TTP) 7.) Execute (EX51.TTP) 8.) Monitor/Source-Level-Debugger (MON51.TTP) 9.) Interrupts des MIDI8031 10.) Tips zur Fehlersuche 11.) Die Demoprogramme 12.) Sprachsynthese mit SMSSEDIT.PRG 13.) Zusatzhardware, MIDI8031-Powerport 14.) Stromsparmechanismen des 80C31 15.) Fileformate 16.) Programme ins EPROM brennen, das OS-EPROM, EPROM Service 17.) Literatur zum Thema 1.) Vorwort, Übersicht ====================== Ein Entwicklungssystem für Mikrocontroller gab es bis jetzt meines Wissens nach für ATARI Computer noch nicht. Aus aktuellem Anlass habe ich die vorliegende Software/Hardware entwickelt: Sie bezieht sich auf das Mikrocontrollerprojekt in der *************************************************** * Zeitschrift ST-Computer, Ausgaben Mai-Juli 1992 * *************************************************** In diesen Ausgaben finden sie auch die Grafiken und Baupläne zur Hardware! Schreibfehler und andere kleinere Unzulänglichkeiten in diesem Text bitte ich zu entschuldigen. Ich bitte sie, aus diesen Fehlerchen auch keine Rückschlüsse auf die Qualität der Software zu ziehen: Die Software wurde von mir sehr sorgfältig entwickelt, da ich sie vor allem auch für den eigenen Gebrauch konzipiert habe. Soft- und Hardware wurden monatelang intensiv ausgetestet, bevor ich mich dazu entschloss sie der Allgemeinheit ( = Public Domain) zugänglich zu machen! Mikrocontroller? What's this? ----------------------------- Was ein Mikroprozessor ist, weiss inzwischen ja wohl jeder. Dagegen ist der Begriff Mikrocontroller den meisten weniger geläufig. Der Grund: Mikrocontroller sind 'Heinzelmännchen'; sie arbeiten fast immer im Verborgenen: in Videorecordern, Waschmaschinen, Aufzügen, in Spielzeug, Alarmanlagen und sogar in Bohrmaschinen! Mit Sicherheit gibt es heutzutage bedeutend mehr Mikrocontroller auf der Welt als "reine" Mikroprozessoren. Was aber ist der Unterschied: Zum Aufbau eines "klassischen" Computersystems werden mindestens die folgenden Komponenten benötigt: Mikroprozessor \ Schnittstellen \ Etwas RAM = Mikrocontroller ROM oder EPROM als Programmspeicher / Taktgenerator / Ein Mikrocontroller ist die Summe dieser 5 Teile in einem einzigen IC. Daher werden Mikrocontroller oft auch als Ein-Chip-Computer bezeichnet, was den Sachverhalt sehr genau beschreibt: Die gesamte Peripherie eines Mikrocontrollers besteht im Minimalfall aus einer Batterie und einem Quarz. Durch den massenhaften industriellen Einsatz ist der Preis für Mikrocontroller ziemlich niedrig: Einfache Typen sind bereits für weniger als 5.-- DM zu erhalten! Für den Amateur sind Mikrocontroller prinzipiell nicht weniger interessant als für die Industrie: Die Wahrscheinlichkeit, dass eine selbstgebastelte Schaltung funktioniert, sinkt eben mit der Anzahl der Bauteile. Es gibt eigentlich nur ein Haupthindernis: Ein Entwicklungssystem für Mikrocontroller kostete bis heute mindestens 1000 DM, davon abgesehen, dass es sowas für ATARIs bis jetzt überhaupt nicht gab. Doch jetzt, brandneu, gibt es MIDI8031, ein komplettes Entwicklungs- system für die industriell am häufigsten verbreitete Mikrocontroller- Familie: Die "80x1x"-er . Und es kostet keine 1000 DM, keine 500 DM, und auch nicht 100 DM, nein: es ist UMSONST, Public Domain! Sie benötigen lediglich die Hardware, die sie als kompletten Bausatz preiswert selbst herstellen können. ! Speicher auf dem Chip ! Name ! ROM/EPROM ! RAM ! Besonderheiten ------+---------------+---------+------------------- 8051 4kB ROM 128B 8751 4kB EPROM 128B 8031 keines 128B 8052 8kB ROM 256B 87C71 4kB EPROM 128B / Das 'C' bedeuted CMOS = 80C31 keines 128B \ niedrigen Stromverbrauch 80C515 8kB ROM 256B / 8 AD-Wandler sind mit auf dem 80C535 keines 256B \ auf dem Chip! ... ... ... Die "80x1x"-Mikrocontroller-Familie umfasst einige Dutzend Mitglieder. Einige der "80x1x" besitzen keinen Programmspeicher auf dem Chip (wie etwa der 8031). Diese sind dann keine echten Ein-Chip-Computer, da sie zusätzlich ein ROM oder EPROM benötigen. Manche der Typen sind für Amateure ungeeignet (zum Beispiel der 8051): Ein ROM kann nur bei der Herstellung des Chips programmiert werden, soetwas lohnt sich erst bei hohen Stückzahlen. Typen mit EPROM (8751,87C51, ...) lassen sich mit etlichen handelsüblichen EPROM-Programmiergeräten programmieren. Das 'C' im Namen mancher Typen (etwa 80C31) bedeutet, dass es sich um einen CMOS-Typ handelt. CMOS-Typen brauchen nur sehr wenig Strom. Die Verwandschaft der Familie liegt an zwei Dingen: Zum einen besitzen alle eine minimale gemeinsame Anzahl von Ports, Timern und RAM, zum anderen sind die CPUs aller Typen identisch! Das heisst: Der Befehlssatz der CPUs ist 100% identisch. Der Befehls- satz an sich ist sehr einfach zu erlernen. Einige Literaturhinweise zu Büchern, die den Befehlssatz beschreiben finden sie in Kapitel 17. Obwohl er an sich recht einfach ist, ist er trotzdem auch effizient, und vor allem schnell: Für eine 8*8-Bit Multiplikation oder eine 16/8-Bit Divison benötigten selbst die Langsamsten der Familie nur 4 Mikrosekunden! Alle "80x1x" sind somit Software-aufwärtskompatibel zum 8031. Die zusätzlichen Funktionen der grösseren Geschwister des 8031 (sie haben mehr Ports, mehr RAM, ROM oder EPROM, Timer; sie sind schneller; ...) lassen sich durch ein schlaues Softwarekonzept ohne Änderungen mit einem Standard-8031-Assembler nutzen. Doch davon später mehr. Das Entwicklungssystem ---------------------- Das Entwicklungssystem MIDI8031 besteht aus 2 Komponenten: Soft- und Hardware. Die Software selbst ist sehr umfangreich, aber, wie bereits erwähnt, völlig Public Domain! Hier eine kurze Übersicht: Software: 80x1x-Crossassembler, für die ganze "Familie" Source-Level-Debugger (!!! Ein echter Leckerbissen !!!) Monitorprogramm 80x1x-Disassembler GEM-Editor Demo-Programmen (sogar ein Sprachsynthesizer ist dabei) Shell ausführliche Anleitung: Sie lesen sie gerade Die MIDI8031-Hardware besteht aus einem Mikrocontroller 80C31 einem EPROM (das ein kleines "Betriebssystemchen") enthält, einer MIDI-Schnittstelle, und einem 32kB-RAM. MIDI8031 ist ein kompletter Mikrocomputer! Einige Daten: Hardware (Name: "MIDI8031") 80C31-8-Bit CMOS-Mikrocontroller: - Softwarekompatibel zum 8031 - getaktet mit 12 MHz - 16 bidirektionale I/O-Pins - 128 Bytes On-Chip-RAM 32kB RAM max. 32kB EPROM MIDI-Schnittstelle Der Entwicklungsablauf ist folgendermassen: Das 8031-Programm wird auf einem ATARI geschrieben. Per 'Tastendruck' wird es über MIDI in das RAM des MIDI8031 transferiert, wo es getestet werden kann. Läuft es korrekt, bestehen 3 Möglichkeiten: 1.) Sie brennen das Programm in ein EPROM und ersetzen das Original-EPROM des MIDI8031 durch Ihr eigenes. 2.) Oder aber, sie verwenden ihr EPROM für eine komplette Eigenentwicklung. 3.) Als dritte Alternative kann das Programm in einen Mikrocontroller mit eingebautem EPROM gebrannt werden, womit sie sich ihren persönlichen Ein-Chip-Computer verwirklicht hätten, sofern ihr Programm in das EPROM des entsprechenden Chips passt. Besonders durch die eingebaute MIDI-Schnittstelle steht Ihnen mit der MIDI8031-Hardware aber auch die Welt der Musik offen! 2.) Die Hardware MIDI8031 ========================= Die Hardware wurde möglichst einfach gehalten, sie besteht nur aus wenigen Bauteilen, im wesentlichen: - 80C31-Mikrocontroller - EPROM wahlweise 32kB- oder 8kB-Typ (enthält das "Betriebs- systemchen") - RAM 32kB (CMOS-Ausführung) - Optokoppler zur Steuerung der MIDI-Schnittstelle - 2 MIDI-Buchsen (IN/OUT) - Softwaregesteuerte LED - Spannungsstabilisierung 9-20 Volt auf 5 Volt - Reset-Taste - Einige Gatter: Normalerweise kann der 8031 keine Programme im RAM ausführen. Mit einem Extra-Gatter geht das aber trotzdem. - 20 Polige Buchsenleiste an der die 16 Ports, etc. anliegen. Den Schaltplan finden Sie in den oben genannten Zeitschriften, oder aber: Service ------- Nicht jeder hat zuhause eine "Ätzküche" für die Platinenher- stellung. Daher können Sie folgendes Angebot wahrnehmen: Der komplette Bausatz MIDI8031 mit einer hochwertigen Platine (Epoxydharz, verzinnt, mit Bestückungsaufdruck), sämtlichen Bauteilen (incl. 6 Sockel für die ICs), dem gebrannten Entwicklungs- system-EPROM, einer ausführlichen Aufbauanleitung und einer Diskette mit dem vollständigen Public-Domain-Entwicklungs-system für alle ATARI ST/STE ab 512 kB, können Sie für DM 89.-- (Nachnahme) unter dieser Adresse bestellen: Jürgen Piscol Rastatter Str. 144 W-7500 Karlsruhe 51 3.) Installation, Zusatzprogramme ================================= Dieses Entwicklungssystem arbeitet Dateiorientiert, das heisst der Informationsaustausch zwischen den einzelnen Programmen erfolgt über Dateien. Die Software läuft zwar auch von Floppy-Disk, aber eben nur recht langsam. Auch wenn sie eine Festplatte besitzen, empfehle ich ihnen die Verwendung einer RAM-Disk. Nicht alle Programme des Entwicklungssystems stammen von mir: Den Editor und die RAM-Disk habe ich anderen Public-Domain- Disketten entnommen. Sie sind unverändert, die Anleitungen dazu sind separat in den Dateien: VDISK35.DOC, EDITOR.DOC (Textdateien). Falls sie eine Festplatte besitzen: Kopieren sie zur Installation den ganzen Ordner MIDI8031 darauf, bei Bedarf kopieren sie die RAM- Disk VDISK.ACC ins Bootlaufwerk. Falls sie keine Festplatte besitzen: Fertigen Sie sich eine Kopie dieser Disk an und kopieren sie die RAM-Disk VDISK.ACC ins Wurzelverzeichnis. Die RAM-Disk belegt nach dem Booten nur einen Eintrag in der Menueleiste, jedoch noch keinen RAM-Speicher! Um mit MIDI8031 zu arbeiten melden sie die RAM-Disk mit einer entsprechenden Gröβe an (bei 1 MB RAM z. Bsp. mit 500kB) und kopieren Sie die gewünschten Dateien des Entwicklungs- systems (oder gleich den ganzen Ordner MIDI8031) hinein, nun kann es losgehen ... Beachten sie, daβ die RAM-Disk reset-fest ist! Zum Anschluss von MIDI8031 an ihren ATARI benötigen sie 2 Stereo- Überspielkabel von etwa 1-2 Meter Länge. Falls sie sich über die Eignung der Kabel nicht ganz sicher sind, finden sie dazu auch einen Hinweis im Kapitel 7. Booten von dieser Disk ---------------------- Damit sie sofort loslegen können, habe ich auf dieser Disk bereits einige Voreinstellungen getroffen: - Booten sie ihren Rechner (sofern er mind. 1 MB RAM besitzt) von dieser Disk. - Auf Ihrem Desktop finden sie rechts oben ein RAM-Disk Zeichen. - Gehen sie auf den Menuepunkt "Ramdisk". Die RAM-Disk bietet ihnen nun die Grösse 512kB an. Klicken sie auf "ANMELDEN". - Kopieren sie nun den kompletten Ordner MIDI8031 auf die RAM-Disk. - Klicken sie doppelt auf eine beliebige "*.S51"-Datei um die Shell aufzurufen. 4.) Shell (SHELL51.PRG) ======================= Die meisten Programme des Entwicklungssystems werden über Kommandozeilen gesteuert. Um Ihnen dazu die Arbeit etwas zu vereinfachen, existiert die Shell (SHELL51.PRG): Per Tastendruck wird das Programm assembliert, gestartet, editiert, gelistet, ... Die Shell ist mässig intelligent: Sie versucht sich zu merken, ob z. Bsp. Assemblierung wirklich notwendig ist. Kommandos: 'e': Aufruf des Editors und Übergabe der Projekt-Sourcedatei an ihn. 'x': Wenn nötig wird das Projekt assembliert und gestartet. Das Programm läuft dann auf MIDI8031, bis sie auf MIDI8031 Reset drücken. 'm': Wie 'x'. Das Projekt wird aber nicht gestartet, sondern an den MIDI8031-Monitor übergeben (Debugging). 'd': Wie 'm', zusätzlich erzeugt die Shell aber eine Source-Level- Debugger-Datei. 'p': Um den Assemblervorgang zu kontrollieren, kann hier eine Liste erzeugt werden: LISTE.LST 'n': Manuelle Eingabe des Projektnamens (Immer ohne Extender)! Hinweis: Wenn sie SHELL51 als GEM-Anwendung anmelden, auf die Extender 'S51', und dann das Desktop sichern (Arbeit sichern), reicht es, wenn Sie in Zukunft auf das jeweilige Projekt klicken, den Namen trägt dann die Shell selbst ein. 5.) Assembler (A51.TTP) ======================= Konvention: 8051-Sourcedateien enden mit ".S51". Dateien mit Programmcode für MIDI8031 enden mit ".O51". Diese Dateien werden im folgenden auch als Objektdateien bezeichnet. Der Assembler kann prinzipiell Code für alle 51-er erzeugen. Die Definition der Spezialfunktionen der einzelnen Typen befindet sich in der Datei reg51.inc für 80(C)31,80(C)51,87(C)51. Wenn Sie Programme für andere Typen schreiben wollen, wenden Sie sich bitte an mich. Im Wesentlichen unterscheidet sich der Assembler nicht von anderen. Falls was unklar sein sollte: Lassen Sie sich die Demos ausdrucken. Bedienung --------- Kommentarzeilen beginnen immer mit einem Semikolon. Symbolnamen dürfen maximal 8 Zeichen lang sein. Gross-/Klein-Schreibung wird ignoriert, Umlaute ('AÖÜ') und 'ß' dürfen nicht verwendet werden! Das Rechnen mit Symbolnamen ist jederzeit möglich. Ausdrücke wie z. Bsp. "100-(('a'/$16)+symbol-num*4)" sind erlaubt. Zahlenwerte: ------------ [Dezimalzahl] Byte kann sein: -256..255 Wort: -32768..65535 '[ASCII]' Bsp.: '@' hat den Wert 64 $[Hexzahl] Bsp.: $FFFF hat den Wert 65535 %[Binaerzahl] Bsp.: %11111110 hat den Wert 254 [Symbolname] Es wird der Name des Symbols verwendet. ! Wert des PCs bei Zeilenanfang: Bsp. mov R0,#10 = mov R0,#10 djnz R0,! = w: djnz R0,w spart ein Label! Symbole: -------- Symbole (auch 'Label' genannt) mit Doppelpunkt am Ende, werden als Adressdefinitionen behandelt. Doppelte Definitionen von Adressen sind verboten! Symbole mit '=' am Ende werden als Variable behandelt. Bei Variablendefinitionen sind mehrfache Zuweisungen erlaubt, jeweils die letzte gilt: Bsp: nr = 11 mov A,#nr ; ACC mit 11 laden nr = 21 mov A,#nr ; ACC mit 21 laden Symbole, die mit '?' beginnen, werden als 'versteckt' gekennzeichnet. Sie tauchen in der Symbolliste nicht auf. Sinnvoll z. Bsp. bei sehr kurzen Sprüngen. Symbolnamen dürfen keine deutschen Umlaute enthalten (Bsp.: 'fünf') und auch kein 'ß'. Operatoren: ----------- Es gilt natürlich "Punkt vor Strich". Da der Assembler aber noch mehr sogenannte 'Operatoren' kennt als nur Plus, Minus, Multiplikation und Division, dient die folgende Liste als Übersicht: Hierarchie und Art der möglichen Operatoren: Priorität: Hoch ( ) Normale Klammer . Bitadressen Bsp. ACC.7: Bit 7 von ACC * / + - & Logisches Und (Bsp: %110 & %010 = %010) | Logisches Oder (%110 | %011 = %111) ^ Logisches Exlusiv-Oder (%110 ^ %011 = %101) Priorität: Nieder Direktiven ---------- .registers [Datei] wählt die Definition der Register für Spezialfunktionen, hier nur beigelegt reg51.inc: Für die Typen: 80(C)31,80(C)51,87(C)51 .text_org [Zahlenwert] Adresse des 1. Codebytes. Nur einmal pro Sourcefile erlaubt. Für Programme, die im RAM des MIDI8031 getestet werden sollen, muss der Zahlenwert grösser als $8000 sein, da nur dieser Bereich RAM ist. Das RAM in MIDI8031 beträgt 32kB ab dieser Adresse. .var_org [Zahlenwert] Öffnet ein (uninitialisiertes) Variablen-Segment. in Variablensegmenten sind keine Definitionen er- laubt, nur Reservierungen (.ds.b und .ds.w, siehe nachfolgend). Es sind beliebig viele .var_org pro Sourcedatei möglich. Diese Direktive ist hilfreich beim Aufbau von Variablenfeldern im internen oder externen RAM des 8031. .ds.w, ds.b Reserviert Speicher (Wort/Byte), .w: 2 Bytes pro Wort. Bsp.: test: .ds.w 50 reserviert für 'test' 100 Bytes (die es im Text- segment mit dem Wert 0 initialisiert) .dc.b Definiert ein Byte, oder einen String, d.h. der Speicher wird an dieser Stelle initialisiert. Bsp.: .dc.b "HALLO!",0 Wichtig: Strings werden nicht automatisch beendet, daher hier die Null. .dc.w Schreibt Worte im Intel-Format: Zuerst Low-, dann Highbyte. Bsp.: .dc.w go,hello,$8000,%11111111000 .ibytes [Datei] Fügt an dieser Stelle eine Datei ein. Verwendung Beispielsweise in der Demo PHONEM .hide Versteckt den nachfolgenden Teil des Listing, z. Bsp. beim Source-Level-Debugging, bis zu einem .show: .show Hebt .hide wieder auf. Bsp.: test: .hide .ibytes lange_da.tei .show Verhindert, dass in Listings des Assemblers alle Bytes der langen Datei einzeln erscheinen. .nlist Bei Ausgabe eines Assemblerlistings (z. Bsp. die Funktion 'p' in der Shell) wird ab hier die Ausgabe unterdrückt. .list hebt .nlist wieder auf, nicht aber .show Der Unterschied zwischen .hide/.show und .nlist/.list ist der, dass .hide/.show eine Ebene tiefer ist als .nlist/.list, Bsp.: Sourcefile Assembler-Listing Debugger ------------------------------------------------------------------ .hide .hide .hide .dc.w $1234 .show .dc.w $2345 45 23 .dc.w $2345 45 23 .dc.w $2345 .nlist .nlist .hide .hide .dc.w $1234 .show .dc.w $2345 45 23 .dc.w $2345 .list .list Variablenzugriffe ----------------- Will der 8031 einen Befehlscode holen oder Daten aus dem Programmspeicher (Tabellen, Konstanten), so gibt der die Adresse aus und setzt danach das Signal PSEN- auf LOW. Bei Lesezugriffen auf den RAM-Speicher wird nach der Adressausgabe das Signal RD- auf LOW gesetzt, bei Schreibzugriffen das Signal WR-. Normalerweise würden also bei gleicher Adresse verschiedene Speicherbausteine angesprochen! Leider gibt es normalerweise keine Möglichkeit Programme im RAM eines 8031-Systems ablaufen zu lassen. Durch den Schaltungs- kniff mit dem NAND-Gatter 74HCT00 werden beide Adressräume bei Zugriffen auf Adressen oberhalb von $8000 vereinigt. Hinweis zum "Linken" -------------------- Der Assembler in der vorliegenden Version 2.x ist nicht in der Lage Programmteile zu linken. Bedeutung des Befgriffs "linken": Normalerweise bestehen grössere Programme immer aus mehreren kleineren Modulen, die getrennt editiert und assembliert werden. Beim "linken" werden diese kleinerern Module zu einem funktions- fähigen Programm zusammengesetzt. Ein "Linker" ist zwar in diesem Paket nicht enthalten, trotzdem ist mit MIDI8031 die Entwicklung mehrteiliger Programme möglich: Solange MIDI8031 mit Strom versorgt wird, bleiben Daten im RAM-Speicher erhalten. Auch bei Drücken der Reset-Taste! Zusätzlich ist es mit der Assembler-Direktive ".text_org" möglich, Code an beliebige Adressen im RAM zu laden. Mein Vorschlag wäre: Verteilen sie ihr Programm in mehrer Blöcke, die jeweils bei markanten Adressen beginnen (etwa bei $8000, $9000, $A000 ...). Zwischen den einzelnen Blöcken liegt dann zwar jede Menge unbenutzter Speicher, aber das ist ja in der Entwicklungs- phase nicht ausschlaggebend. Wenn das Programm später ordnungsgemäss arbeitet, können die Lücken immer noch zusammengeschoben werden. Jedes der Module beginnt mit einer Liste von Sprüngen, zu den vom Modul angebotenen Funktionen. Der erste Sprung geht jeweils entweder zu einer Endlosschleife oder zum Hauptprogramm. Jedenfalls darf der 8031 nie ins "Leere" springen, da sonst Daten zerstört werden könnten. Sie können nun an jeweils einem der Module arbeiten. Ein Beispiel: -------------------------------------------------------------- ;* Datei 1, Hauptprogramm: .registers reg51.inc datei1 = $8000 ; Hier beginnen die Module datei2 = $9000 .var_org datei2 ; Funktionen im Unterprogrammmodul .ds.b 3 ; Einsprungroutine led_on: .ds.b 3 ; ljmp belegt 3 Bytes led_off: .ds.b 3 .text_org datei1 ; Modul beginnt bei $8000 stop: ljmp stop ; Endlosschleife oder ljmp go go: mov SP,#$30 ; Stack fuer lcall setzen lcall led_on ; Fremdes Unterprogramm aufrufen lcall wait lcall led_off lcall wait sjmp go ; * Unterprogramm: Wartet etwa 0.2 sec. wait: mov R0,#0 mov R1,#1 ?w0: djnz R0,?w0 djnz R1,?w0 ret -------------------------------------------------------------- ; *Datei 1, Unterprogramme: .registers reg51.inc datei1 = $8000 datei2 = $9000 .text_org datei2 stop: ljmp datei1+3 ; Sprung ins Hauptprogramm oder stop led_on: ljmp ?lonn led_off: ljmp ?loff ?lon: setb P3.5 ; MIDI8031 LED an ret ?loff: clr P3.5 ; aus ret -------------------------------------------------------------- Angenommen, sie möchten an den Unterprogrammen arbeiten: Editieren sie Datei1, setzen sie den ersten ljmp als Endlosschleife und starten sie datei1 auf MIDI8031. Wählen sie nun den neuen Projektnamen datei2, sorgen sie dafür, dass der erste ljmp das Hauptprogramm aufruft.... Natürlich ist diese Methode zur Entwicklung mehrteiliger Programme schon etwas aufwendiger. Vor allen Dingen kann man nicht mehr einfach schnell mal so "drauflosprogrammieren", da hier schon ein gewisses Mass an Programmierdisziplin nötig wird. Aber mit etwas Konsequenz können sie mit dieser Methode Programme beliebiger Länge entwickeln. Vorschau -------- Der Assembler ist im Moment noch nicht besonders schnell. Für die Zukunft habe ich folgende Erweiterungen geplant: 1.) Umstellung auf Tokenisierende Assemblierung (Faktor 100 schneller) 2.) Makros 3.) Bedingte Assemblierung 4.) Linkfähige Objektdateien 6.) Disassembler (DIS51.TTP) ============================ Der Disassembler kann O51-Dateien wieder in disassemblieren (was sonst). Parameter der Kommandozeile: 1.) Name O51-Datei ohne Extender 2.) '>'+Ausgabedatei (vollständiger Name) Diese Kommandozeile disassembliert die Datei TEST.O51 in die Datei LIST.LST: TEST >LIST.LST 7.) Execute (EX51.TTP) ====================== Um vorhandene O51-Dateien an MIDI8031 zu senden und sofort zu starten dient dieses Programm. Es kann mit der TOS-Funktion Pexec() auch von anderen Programmen aufgerufen werden. Wichtig: Bei Pexec muss das 1. Byte der Kommandozeile ihre Länge enthalten (Pascal-Format). Parameter ist der Name der zu startenden O51-Datei ohne den Extender .O51. Es ist zu empfehlen, vor Aufruf von EX51.TTP MIDI8031 zu resetten, falls das momentan laufende Programm Interrupts verwendet. Datensicherheit, MIDI-Kabel --------------------------- Die Datenübertragung über MIDI ist sehr zuverlässig, solange sie (abgeschirmte) MIDI-Kabel verwenden, deren Länge 2 Meter nicht übersteigt. Eine Fehlererkennung bei der Datenübertragung wurde deshalb nicht vorgesehen. Das Programm TESTRAM.PRG dieser Disk dient zum Test der Datenübertragung und des MIDI8031 RAMs. Bei MIDI werden die Daten mit einer Rate von 31500 Baud übertragen. Das sind maximal etwa 3 Kilobyte pro Sekunde! Zusätzlich wurde MIDI eigentlich als Schnittstelle zwischen Synthesizern für Musik entwickelt. Um der Gefahr von Brummschleifen zu entgehen, sind MIDI-Geräte immer galvanisch (also über Optokoppler) voneinander getrennt. Als MIDI-Kabel eignen sich gewöhnliche Stereo-Überspiel- kabel. Mit Mono-Kabeln gibt es normalerweise Probleme, da im ATARI die (normalerweise) freien PINs der MIDI-Buchsen teilweise belegt sind! Spezielle sogenannte "MIDI-Kabel", wie sie oft in Musik- geschäften angeboten werden, sind zwar auch geeignet, aber bedeutend teuerer und keinesfalls besser als Stereo-Überspielkabel. 8.) Monitor/Source-Level-Debugger (MON51.TTP) ============================================= Um Fehler in Programmen zu suchen, dient diese Programm. Ein übergebens Programm wird an MIDI8031 gesendet, danach wird ein Bildschirm aufgebaut, der die wichtigsten Register anzeigt, sowie Teile des Programmes. Die Fähigkeiten von MON51: - bis zu 10 Breakpoints - Single-Step-Betrieb - ständige Anzeige wichtiger Register und Flags - Anzeigen des internen und externen RAMs von MIDI8031 - Disassembler - Source-Level-Debugger MON51 wird durch die SHELL51 gestartet. Übergibt die Shell an MON51 eine Source-Level-Debugger-Datei (Extender 'M51'), so integriert MON51 diese folgendermassen: Cursortasten Hoch/Runter: Scrollen im Sourcetext, 1 Zeile. Mit 'Shift' jeweils 10, mit 'Control' 50 Zeilen. Im Sourcetext können sie Teile mit der Assemblerdirektive .hide verstecken! Scrollen ist nur im Sourcetext möglich, nicht aber bei disassemblierten Programmteilen. PC befindet sich an einer Stelle, zu der Sourcecode vorliegt: Sourcecode wird angezeigt. PC befindet sich an einer Stelle im RAM, zu der kein Sourcecode vorliegt: RAM wird disassembliert. PC befindet sich im EPROM (etwa bei Programmfehlern): Nichts wird angezeigt, ausser die Adresse des PCs. Bei Berechnungen: Mit dem Sourcecode übergibt die Shell an MON51 auch eine Symbolliste, so dass die Symbolnamen verwendet werden können. Befehle des Monitors -------------------- - 'g' ohne Zusätze: Das Programm wird an der Stelle fortgesetzt, auf den der PC zeigt. Das Programm kann per Tastendruck unterbrochen werden, oder wenn es auf einen Breakpoint trifft. - 'g + Zahlenwert': Programm starten ab Zahlenwert. Bsp.: g schleife+$16 - Die wichtigste Taste ist wohl 'Undo': Sie enthält 'g <NL>'. - 's+': Single-Step-Ein: Pro 'g' wird nun nur ein Schritt ausgeführt. - 's-': Single-Step-Aus - 'b': Liste der Breakpoints anzeigen - 'b-': Alle Breakpoints aufheben - 'b0-' bis 'b9-': Einzelnen Breakpoint aufheben - 'b0 = Zahlenwert' bis 'b9 = Zahlenwert': Setzen eines Breakpoints (Beachten Sie dazu die Hinweise am Ende des Kapitels) - 'd': Erneuter Download: Oft ist es wünschenswert das gleiche Programm nocheinmal zu starten. Dazu dient 'd'. Vor 'd' kann MIDI8031 evtl. mit der Reset-Taste neu gestartet werden, falls nötig. - '?' Dient zur Berechnung von Ausdrücken Bsp.: ? $8000+(schleife+nr)*3 Ausgabe als Dezimal- und Hexadezimal-Zahl. - 'x Zahlenwert': Zeigt externes RAM des MIDI8031 an, Bsp.: x $8000 - 'r Zahlenwert': Zeigt internes RAM des MIDI8031 an, maximal- Adresse ist 127! Bsp.: r 120 - 'q': Verlässt MON51, MIDI8031 bleibt angehalten, wird aber nicht resettet (das können sie ja bei Bedarf manuell am MIDI8031 machen). Troubleshooting --------------- MON51 unterstützt keinen selbstmodifitzierenden Code. Ausserdem benötigt er etwa 10 Bytes auf dem Stack des MIDI8031. Treten beim Debuggen wiederholt unerklärliche Zustände auf, so liegt das oft an falsch gesetztem (oder garnicht gesetztem) Stack des MIDI8031. Ein weiteres "Problemchen" liegt an dem geringen MIDI-Buffer des ATARI: Gelegentlich kann es vorkommen, dass dieser überläuft, z. Bsp. bei sehr schnellem Single-Steppen: Plötzlich werden 'seltsame' Registerinhalte angezeigt, Adressen die es nicht gibt... Abhilfe: Einfach noch einen Step mehr machen: Der PC des MIDI8031 wird von diesem selbst verwaltet und nur bei Bedarf verändert etwa bei explizitem Go (Bsp 'g $8000'). Interrupts: Jedesmal wenn MON51 sich meldet (Breakpoints, Singlestep) werden die Interrupts des 8031 disabled. Bei der Verwendung von Interrupts sollten sie also die Interruptroutine vielleicht zuerst als 'normales' Unterprogramm austesten, und erst dann auf einen Interrupt legen. Breakpoints: Breakpoints auf MIDI8031 werden dadurch erzeugt, dass MON51 an die Stelle des Breakpoints eine (im Moment 7 Bytes lange) Routine schreibt. Nun kann folgendes Problem auftreten: Angenommen sei folgender Sourcetext: test: ret nixgut: inc R0 ret Wenn Sie nun einen Breakpoint an die Stelle 'test' setzen, wird auch das Unterprogramm 'nixgut' überschrieben, was zu seltsamen Effekten führen würde... Also, behalten Sie diese Tatsache im Hinterkopf und setzen Sie nie Breakpoints zu nahe vor derartigen Sprungbefehlen. Trotz alledem glaube ich, dass MON51 ein sehr gutes Hilfsmittel bei der Softwareentwicklung für MIDI8031 ist. 9.) Interrupts des MIDI8031 =========================== Der 8031 springt bei Auftreten eines Interrupts immer auf eine fest vorgegebene Adresse: $0003 Externer Interrupt 0 (Pin -INT0) $000B Timer 0 Interrupt $0013 Externer Interrupt 1 (Pin -INT1) $001B Timer 1 Interrupt $0023 Serieller Interrupt (Senden und Empfangen) Im Entwicklungssystem MIDI8031 liegen diese Adressen im EPROM, ausserdem stehen für die einzelnen Interruptroutinen so nur je 8 Bytes zur Verfügung. Daher befindet sich an dieser Stelle im Enntwicklungssystem-EPROM folgender Code: $0000: reset: ljmp ... ; Systeminitialisierung $0003: int0: ljmp $8003 .ds.b 5 $000B: timer0: ljmp $800b .ds.b 5 $0013: int1: ljmp $8013 .ds.b 5 $001B: timer1: ljmp $801b .ds.b 5 $0023: serial: jnb PSW.5,?ose ; F0=0: MIDI abfangen ljmp $8023 ; F1=1: USER-MIDI ?ose: ajmp ... Bei Auftreten eines Interrupts springt der 8031 also zur entsprechenden Adresse im RAM! Verwendet werden Interrupts z. Bsp. im Schrittmotorprogramm oder im Sprachsynthesizer. Eine Besonderheit stellt der serielle Interrupt dar: Normaler- weise dient er ja zur Steuerung des Entwicklungssystems. Wollen sie jedoch den seriellen Interrupt für eigene Programme verwenden, müssen sie das Prozessorflag F0 setzen, was natürlich auch heisst, dass dieses Flag anderweitig nicht verwendet werden darf! Verwendet Ihr Programm Interrupts, und läuft es im RAM korrekt, und beginnt es normalerweise an Adresse $8000, können Sie es ohne Probleme in ein EPROM brennen, indem Sie einfach die Anfangsadresse in $0 ändern und mit diesem Sourcecode eine O51-Datei erzeugen, mehr dazu später... Allerdings laufen die Interrupts im EPROM etwas schneller ab, da ja nun jeweils ein Sprungbefehl fehlt! 10.) Tips zur Fehlersuche ========================= Über dieses Thema liesse sich natürlich sehr viel sagen. Oft aber liegen Fehler an so elementaren Dingen, dass man fast nicht drauf- kommt: - Initialisierung von Interrupts: Interrupts werden durch 3 Bits initialisiert: 1.) Das Enable-Bit des Interrupts im IE-Spezialfunktionsregister, 2.) Das Prioritäts-Bit des Interrupts im IP-Register, 3.) Das Generelle Interrupt-Enable- Bit EA, es ist das oberste Bit im Register IE (also IE.7). Speziell zu bei Timern gibt es auch noch das Zusammenspiel zwischen Timer-Overflow-Flag (TF0/1) und Timer-Run-Flag (TR0/1): Immer wenn ein Timer dir Grenze 255->0 Überschreitet wird sein Overflow-Flag (TF0/1) gesetzt. TF0/1 wird bei Ausführung eines Interrupts automatisch rückgesetzt. Bevor sie Timer-Interrupts verwenden, sollten sie zusätzlich diese Sequenz in Ihrer Software einbauen: 1.) Timer Interrupt disablen, 2.) TR-Bit löschen, 3.) TF-Bit rücksetzen ( = auf 0). - Stack: der Stack wächst nach oben! Vergessen Sie niemals ihn zu initialisieren. Das Entwicklungssystem benötigt etwa 10 Bytes auf dem Stack. - Read-Modify-Write: Jedem Port ist noch ein Zwischenspeicher vorgeschaltet, der den Ausgabepegel des Ports speichert. Manche Befehle lesen nun den Wert des Port-Latches, andere wiederum den wirklichen Pegel am Port. Insbesondere im Zusammenhang mit Port 3 kann dies zu Problemen führen: Der Befehl mov A,P3 etwa liest den am Port aussen anliegenden Pegel, indem einfach der Port auf LOW geschaltet wird, und dann gemessen wird, ob ein Strom fliesst. Leider hängen auch die Signale -RD und -WR an diesem Port. Durch den Lesebefehl ist deshalb das RAM der Meinung, es soll beschrieben werden, was sofort zum Absturz von MIDI8031 führt! Dagegen ist das Lesen des Portlatches völlig ungefährlich. Zu diesem Thema finden Sie Informationen unter dem Stichwort: Read-Modify-Write-Befehle in jedem Buch zum Thema 51-er Controller. 11.) Die Demoprogramme ====================== A - Dieses Minimalprogramm bringt die LED von MIDI8031 zum Blinken MORSE ----- Dieses Programm gibt einen Text als Morsezeichen aus, indem es mit der LED blinkt, und auch Töne am Pin P1.0 ausgibt. Ausserdem zeigt es auch, wie Portpins abgefragt werden können: Wenn Sie zwischen Pin P3.3 und GND (Buchsenleiste Pin 15 und 20) eine Taste anschliessen, können sie durch Drücken der Taste die Tonhöhe des Morsesignals verstellen. Der Lautsprecher wird zwischen Pin 2 und 3 der Buchsenleiste angeschlossen. Der Port kann im LOW- Zustand pro Pin nur wenige Miliampere ziehen. Daher muss dem Laut- sprecher ein Wiederstand vorgeschaltet werden. Je nach Wiederstand des Lautsprechers sollte der Gesamtwiederstand mindestens 200 Ohm betragen, um Schäden am Port des MIDI8031 zu vermeiden. Leider bleibt aufgrund des Vorwiederstandes nicht mehr viel Leistung für den Lautsprecher übrig, wenn seine Impendanz klein ist (4-8 Ohm). Empfehlenswerter sind hier sogenannte 'Mittelohmige Lautsprecher', deren Impendanz etwa 40-45 Ohm beträgt. Als besonders geeignet für Tonausgabe hat sich die Schaltung bewährt, wie sie im Text des Programmes PHONEM.S51 beschrieben ist, wie noch folgt. SCHRITT ------- Dieses Programm dient zur gleichzeitigen Ansteuerung zweier Schrittmotoren. Prinzipiell soll es eigentlich mur zeigen, wie problemlos sich auch Interrupts in eigenen Programmen verwenden lassen. Die Schrittmotoren werden über Port P1 gesteuert. Es können nur sogenannte 4-Strang-Motoren verwendet werden, die aber auch am verbreitetsten sind. Dazu wird die spezielle MIDI8031- Hardware-Erweiterung MIDI8031-Powerport verwendet, die im 3. Teil der Serie beschrieben worden ist. MIDI8031-Powerport ist aber bedeutend mehr als nur eine einfache Schrittmotorkarte: Auf der Platine befinden sich 8 preiswerte SIPMOS-Leistungs-MOSFET- Transistoren, von denen jeder(!) maximal 20 Ampere ziehen kann (Summe also 160 Ampere!). Dabei kann die Taktrate bis zu 500 kHz betragen. Prinzipiell können sie an den MIDI8031-Powerport alles anschliessen, das sich mit maximal 30 Volt und 20 Ampere betreiben lässt: Kleinbohrmaschinen, Lötkolben, Halogenlampen, Relais, ... Die Bauanleitung zu dieser Karte finden sie, wie bereits erwähnt im 3. Teil der Serie. Zu SCHRITT gehört auch die Datei SCHRITT.TXT: Ein GFA-Basic-Programm: Starten sie SCHRITT von der Schell aus und verlassen sie dann die Shell. Starten sie nun GFA-Basic und laden Sie mit MERGE SCHRITT.TXT. SCHRITT.TXT gibt für jeden Motor ein individuelles Fahrprogramm aus und zeichnet es auf dem Bildschirm. CODE ---- Ein Software-Rauschgenerator. OS -- Das ist der Sourcecode des Entwicklungssystem-EPROMS PHONEM ------ Das wohl interessanteste Demo-Programm überhaupt: Ein Sprach- synthesizer mit linearem 7-Bit-Pulswandler. Mithilfe von SMSEDIT.PRG, einem Programm zur digitalen Signalverarbeitung, das im nächsten Kapitel beschrieben wird, können aus gesampelten Sprachsignalen Dateien erzeugt werden, mit denen PHONEM gesteuert wird. In ein 32KB-EPROM passen ohne Aufwand bis zu 1 Minute Sprache in guter Qualität. Einige fertige Text befinden sich bereits mit im Paket, sie müssen nur noch den jeweiligen Namen der Datei im Sourcecode zu PHONEM einsetzen. PHONEM ist in der vorliegenden Fassung nur ein Fragment: ver- bessert man die Datenverwaltung noch etwas, lassen sich der Speicherverbrauch ohne Qualitätseinbusen auf etwa 1/5 senken! Geht man noch weiter, lassen sich aus den Daten die Grundbausteine menschlicher Sprache, die sogenannten Phoneme isolieren. Dann allerdings sinkt die Qualität etwas ab, aber der Speicherverbrauch l iegt bei weniger als 50 Bytes pro Sekunde Sprache! In jedem Fall bleibt die Sprache noch ziemlich gut verständlich. Wollen Sie PHONEM in ein EPROM brennen, beachten Sie bitte die Hinweise im Kapitel Interrupts: Das Timing von PHONEM ist auf den Zyklus genau berechnet. In der EPROM-Version müssen daher 3 zusätzliche Zyklen in die Timer0-Interruptroutine eingebaut werden (Z. Bsp. 3 mal NOP). Die Arbeitsweise von PHONEM: Aus dem gesprochenen und gesampelten Text isoliert SMSSEDIT die wesentlichen Merkmale der Sprache: Jede Sekunde Sprache wird in etwa 60 Abschnitte zerlegt. Für jeden Abschnitt wird eine Hartley-Transformation durchgeführt (das ist eine der FFT verwandte Transformation). Aus dem Leistungsdichte-Spektrum eines jeden Fensters werden die 12 wichtigsten Frequenzen entnommen, zusammen mit ihrer Amplitude. Die Synthese in PHONEM erfolgt nun derart, dass die jeweiligen 6 Frequenzen mithilfe einer Tabelle einer Sinusschwingung wieder zusammmengesetzt werden. Leider kann der 8031 nur vorzeichenlose Zahlen miteinander multiplizieren. Daher ist zu jedem Datensatz noch ein Extrabyte zugefügt, das einen Offset angibt, der jeweils addiert wird. Pro Sekunde synthetisiert MIDI8031 etwa 8000 Werte des Signals. Um das Signal hörbar zu machen, wird es als Pulsweite-Moduliertes Signal am Portpin P1.0 ausgegeben. Leider pfeift das Signal noch etwas. Leidliche Abhilfe schafft ein Tiefpass, wie im Source- text beschrieben. Besser noch wäre ein aktives Filter, was aber auch den Aufwand in die Höhe treiben würde. Interessante Bilder ergeben sich, wenn man den Frequenzverlauf der einzelnen Komponenten zeichnet: SMSSEDIT sortiert die Daten nach Frequenz. Zeichnet man also den Verlauf der Frequenz- komponenten auf, deren Amplitude grösser als 1 ist, ergeben sich interessante Muster, die für jeden Menschen (der den gleichen Text spricht) in etwa gleich sind! Die meisten Spracherkennungs- programme arbeiten nach diesem System. 12.) Sprachsynthese mit SMSSEDIT ================================ Dieses Programm wurde ursprünglich für einen anderen Zweck geschrieben. Daher enthält es viele Funktionen, die hier nicht notwendig sind. Vorgehensweise: Mit 'l' (Bereich laden) wird eine bereits gesampelte Datei eingeladen (eine, ZAHL1_10.PAT, befindet sich bereits auf Disk). 'r': Falls sie einen Sampler zum Anschluss am Druckerport des STs besitzen, probieren sie einfach mal aus, ob er mit SMSSEDIT zusammenarbeitet: 'r'+ '<Taste>' startet die Aufnahme. Mit 'p' wird der geladene Bereich abgespielt (Monitorlautsprecher dazu voll aufdrehen). Mit 'b' können sie mit der Maus einen Ausschnitt des Bereichs zoomen, mit 'o' kommen sie wieder zurück. mit 'i' wird eine Sprachanalyse des Bereichs durchgeführt und das synthetisierte Signal anstelle des Originals eingesetzt. Haben sie ihr MIDI8031 am ATARI angeschlossen, können sie auch das synthetische Signal dort ausgeben, indem sie vor 'i' das '~' drücken. Die Analyse ist enorm rechenaufwendig. Ich habe dazu die schnellsten derzeit bekannten Analysealgorithmen verwendet (selbstverständlich in 100% optimiertem Assembler). Wenn sie das synthetisierte Signal über MIDI8031 ausgegeben haben, empfiehlt es sich, es durch Druck der Reset-Taste zu beenden. '0' speichert die gewonnen Koeffizienten auf Disk ab (Format PHO) '1' lädt eine PHO-Koeffizientendatei ein. Es befindet sich bereits eine mit auf Disk. '2' führt nur eine Synthese mit den bereits vorhandenen Koeffizienten durch (Bsp.: erneute Augabe an MIDI8031) '3' wählt einen anderen Analyse-Verstärkungsfaktor '4' speichert die Koeffizienten im Format P51 ab, so dass sie mit PHONEM verwendet werden können. Der Filestruktur ist folgendermassen: - Jede Sekunde Sprache wird in ca. 60 Fenster zerlegt, von denen jedes durch 13 Bytes beschrieben wird. - Die ersten 6 Bytes eines Fensters enthalten die 6 Frequenzen der Komponenten (0..127), danach kommen die 6 Lautstärken der Komponenten,(0..255), zum Schluss noch ein Offset der das Synthesesignal auf Wandlermitte justiert. Falls sie an einer genauen Anleitung zu SMSSEDIT interessiert sind: SMSSEDIT ist Teil des SMS Synthesisers V1.10, den sie in jeder gut sortierten Public-Domain-Sammlung finden. Auf der SMS-Diskette ist auch eine detailierte Anleitung zu SMSSEDIT enthalten. 13.) Zusatzhardware, MIDI8031-Powerport ======================================= Die Menge der möglichen Hardware-Erweiterungen zu MIDI8031 ist völlig beliebig. MIDI8031-Powerport ist lediglich ein eine Möglichkeit. Es sind nur einige Dinge zu beachten: Die Ports des 80C31 enthalten stark vereinfacht: (+ 5 Volt) ---------------+ | [ Pull-Up-Wdst etwa 20kOhm ] | +----------> Portpin | | <-- FET, kann bis etwa 20 Mili-Ampere - - - ------| <-- aufnehmen, mehr ist gefährlich | ----- --- GND - - Nach Reset befinden sich Portpins immer auf High. - Eingabegeräte: Taster, Schalter, ... werden immer zwischen dem Portpin des 80C31 und GND angeschlossen. Aus Schutzgründen können sie dem Taste, Schalte, ..., einen 150 Ohm Wiederstand vorschalten (Struktur des Portes ist in Wirklichkeit komplizierter, auch zwischen +5V und dem Pin liegt noch ein zweiter FET, der aber nur für wenige Mikrosekunden bei Schreibzugriffen auf den Portpin durchschaltet). - Ausgabe: Im LOW-Zustand ist der FET durchgeschaltet. Trotzdem ist die Verwendung von Puffern (wie etwa im MIDI8031-Powerport, wie in ST-Computer 7/92 beschrieben) zum Schutz des 80C31 zu empfehlen. 14.) Stromsparmechanismen des 80C31 =================================== Die CMOS-Mikrocontrollertypen der 51er-Familie, wie auch der 80C31, besitzen 2 softwaermässige Mechanismen zur Reduzierung der Leistungs- aufnahme des Mikrocontrollers. Die beiden Zustände sind als 'IDLE-Mode' und als 'POWER-DOWN-Mode' bezeichnet. Zur Aktivierung der Moden gibt es das SF-Register 'PCON'. Das Register PCON ist nicht bitadressierbar! IDLE-Mode --------- Durch Setzen des Bits PCON.0 lässt sich der IDLE-Mode setzen. Im IDLE-Mode bleibt der Prozessor stehen, hält aber die Zustände der Ports. Bei Auftreten eines nicht gesperrten Interrupts (Intern oder Extern) wird der IDLE-Mode wieder aufgehoben und der entsprechende Interrupt ausgeführt. Der IDLE-Mode kann durch folgenden Befehl aktiviert werden: orl PCON,#%1. Sind alle Ports auf High, und die LED aus, verbraucht MIDI8031 nur noch etwa 6 Miliampere, von denen etwa 3 Miliampere auf den 80C31 entfallen, der Rest auf die übrigen ICs, vor allem Optokoppler und Spannungsregler. POWER-DOWN-Mode --------------- Durch Setzen des Bits PCON.1 gelangt der 80C31 in den POWER-DOWN-Mode. In diesem Modus ist der Prozessor praktisch eingefroren. Der Zustand kann nur durch einen Reset beendet werden! Im POWER-DOWN-Mode verbraucht der Prozessor 80C31 nur noch etwa 10 Mikroampere bei einer Versorgungs-Spannung von 2 Volt. Dabei ist der Erhalt der Daten im internern RAM garantiert, sofern der POWER-DOWN-Mode vor Absinken der Versorgunsspannung unter 4.5 Volt aktiviert worden ist. Die Zustände der Ports bleiben ebenfalls erhalten. Da der 80C31 auch im POWER-DOWN- Mode bei einer Versorgungsspannung von 5 Volt etwa 1 Mili- Ampere verbraucht, ist dieser Modus für MIDI8031 eigentlich ungeeignet, da er wie gesagt nur durch Reset beendet werden kann. Für Batteriebetriebene Eigenentwicklungen kann folgendes Schema verwendet werden: - Bei Absinken der Versorgungsspannung unter eine bestimmte Schwelle wird ein Interrupt ausgelöst. - Der Interrupt sichert relevante Daten im internen RAM, setzt möglichst alle Portbits auf 1 und aktiviert den POWER-DOWN-Mode. - Über eine Schaltung mit einer Schottky-Diode wird nur der Prozessor Ruhestromversorgt: Schottky-Diode +5Volt !\ ! +4.8Volt o-------------! >!----------------------+ +Allgemein !/ ! ! ! ! Batterie ! o--------------------------[ Wdst. ]----+-------> +U-Bat ! zum Pin1 ! 80C31 Kond. ----- 100nF ----- ! ! ! --- Gnd - Der Wiederstand wird so bemessen, dass im POWER-DOWN-Mode auch bei schwächerer Batterie eine Spannung von mindestens 2 Volt am Pin1 anliegt. 15.) Fileformate =============== Assembler: Das Format ist total primitiv (Format O51): zuerst kommen die Codebytes. Die letzten 2 Bytes einer O51-Datei geben die Startadresse an (also zwischen $8000 und $FFFF bei wenn das Programm in's RAM des MIDI8031 soll) SMSSEDIT, PHO: Zu jeweils 128 Bytes des Samples werden die 6 wichtigsten Frequenzanteile bestimmt und als Worte abgespeichert: 6 * ( Frequenz.w, Amplitude.w ) Am Ende der Datei folgt 4 * -1L Die Frequenz bezieht sich immer auf eine 256-Schritte lange Sinusschwingung, d.h. der Frequenz '256' würde die Tonfrequenz 7980 Hertz entsprechen, der Frequenz '1' die Tonfrequenz 7980/256 Hertz. Die Amplitude liegt normalerweise immer im Bereich von 0..127. 16.) Programme ins EPROM brennen, das OS-EPROM, EPROM-Service ============================================================= Leider vergisst MIDI8031 alles, wenn ihm der Strom fehlt. Ich habe weiter oben bereits erwähnt, dass Besteller des MIDI8031- Bausatzes einen besonderen Service in Anspruch nehmen können: * Ich brenne EPROMs für Besteller des MIDI8031-Bausatzes zum * Selbstkostenpreis. Dadurch sparen sie sich die Anschaffung eines teuren EPROM-Brenners und sie können die erprobte MIDI8031-Hardware für ihr eigenes Programm benutzen. EPROM-Dateien, OS-EPROM ----------------------- Um ein 8051-Programm in ein EPROM zu brennen, genügt es, wenn sie im Sourcetext die Zieladresse mit .text_org $0 angeben. Falls ihr Programm Interrupts verwendet, stellen sie sicher, dass Interrupts wie im gleichnamigen Kapitel initialisiert worden sind. Der Assembler kann auch direkt aufgerσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσσs Programm wurde ursprünglich für einen anderen Zweck geschrieben. Daher enthält es viele Funktionen, die hier nicht notwendig sind. Vorgehensweise: Mit 'l' (Bereich laden) wird eine bereits gesampelte Datei eingeladen (eine, ZAHL1_10.PAT, befindet sich bereits auf Disk). 'r': Falls sie einen Sampler zum Anschluss am Druckerport des STs besitzen, probieren sie einfach mal aus, ob er mit SMSSEDIT zusammenarbeitet: 'r'+ '<Taste>' startet die Aufnahme. Mit 'p' wird der geladene Bereich abgespielt (Monitorlautsprecher dazu voll aufdrehen). Mit 'b' können sie mit der Maus einen Ausschnitt des Bereichs zoomen, mit 'o' kommen sie wieder zurück. mit 'i' wird eine Sprachanalyse des Bereichs durchgeführt und das synthetisierte Signal anstelle des Originals eingesetzt. Haben sie ihr MIDI8031 am ATARI angeschlossen, können sie auch das synthetische Signal dort ausgeben, indem sie vor 'i' das '~' drücken. Die Analyse ist enorm rechenaufwendig. Ich habe dazu die schnellsten derzeit bekannten Analysealgorithmen verwendet (selbstverständlich in 100% optimiertem Assembler). Wenn sie das synthetisierte Signal über MIDI8031 ausgegeben haben, empfiehlt es sich, es durch Druck der Reset-Taste zu beenden. '0' speichert die gewonnen Koeffizienten auf Disk ab (Format PHO) '1' lädt eine PHO-Koeffizientendatei ein. Es befindet sich bereits eine mit auf Disk. '2' führt nur eine Synthese mit den bereits vorhandenen Koeffizienten durch (Bsp.: erneute Augabe an MIDI8031) '3' wählt einen anderen Analyse-Verstärkungsfaktor '4' speichert die Koeffizienten im Format P51 ab, so dass sie mit PHONEM verwendet werden können. Der Filestruktur ist folgendermassen: - Jede Sekunde Sprache wird in ca. 60 Fenster zerlegt, von denen jedes durch 13 Bytes beschrieben wird. - Die ersten 6 Bytes eines Fensters enthalten die 6 Frequenzen der Komponenten (0..127), danach kommen die 6 Lautstärken der Komponenten,(0..255), zum Schluss noch ein Offset der das Synthesesignal auf Wandlermitte justiert. Falls sie an einer genauen Anleitung zu SMSSEDIT interessiert sind: SMSSEDIT ist Teil des SMS Synthesisers V1.10, den sie in jeder gut sortierten Public-Domain-Sammlung finden. Auf der SMS-Diskette ist auch eine detailierte Anleitung zu SMSSEDIT enthalten. 13.) Zusatzhardware, MIDI8031-Powerport ======================================= Die Menge der möglichen Hardware-Erweiterungen zu MIDI8031 ist völlig beliebig. MIDI8031-Powerport ist lediglich ein eine Möglichkeit. Es sind nur einige Dinge zu beachten: Die Ports des 80C31 enthalten stark v